home *** CD-ROM | disk | FTP | other *** search
- /*
- * Copyright (c) 1987 University of Maryland Department of Computer Science.
- * All rights reserved. Permission to copy for any purpose is hereby granted
- * so long as this copyright notice remains intact.
- */
-
- /*
- * Font file information, readers, etc.
- */
-
- #ifndef _CTEX_TYPES_
- #include "types.h"
- #endif
-
- /*
- * First, font independent information: per glyph info, and per font
- * info.
- */
- struct glyph {
- short g_flags; /* see below */
- /*
- * The following cannot be used with GetRasterlessFont
- */
- short g_rotation; /* see below */
- char *g_raster; /* raster, if known */
- /*
- * These, however, do come with rasterless fonts,
- * even though they relate only to the raster.
- */
- i32 g_height; /* height of bounding box */
- i32 g_width; /* width of bounding box */
- i32 g_yorigin; /* y origin (>= 0 -> within box) */
- i32 g_xorigin; /* x origin (>= 0 -> within box) */
- /*
- * This of course comes with every font.
- */
- i32 g_tfmwidth; /* width in scaled points (not FIXes!) */
- #ifdef notyet /* THESE NEED MORE THOUGHT */
- i32 g_xescapement; /* x escapement (`chardx') */
- i32 g_yescapement; /* y escapement (`chardy') */
- #endif
- /*
- * This is provided purely for DVI to device conversion programs.
- */
- int g_pixwidth; /* width in pixels */
- /*
- * Mainly for internal use, index is the glyph index within the
- * font. That is, f->f_gly[i]->g_index == i.
- */
- int g_index; /* character index */
- /*
- * g_details and g_integer are purely for the font reading
- * subroutines to use however they will. g_next makes lists
- * of glyphs while the glyphs are free.
- */
- union { /* various options */
- char *g_details; /* details: arbitrary */
- i32 g_integer; /* 32 bit integer */
- struct glyph *g_next; /* linked list */
- } g_un;
- };
-
- /*
- * Glyph flags.
- */
- #define GF_VALID 0x0001 /* glyph is `real' */
- #define GF_USR0 0x0100 /* reserved to user code */
- #define GF_USR1 0x0200 /* reserved to user code */
- #define GF_USR2 0x0400 /* reserved to user code */
- #define GF_USR3 0x0800 /* reserved to user code */
-
- /*
- * Rotations are in quarter-pi steps, counterclockwise of course.
- * This order must be maintained; see rotate.c.
- */
- #define ROT_NORM 0 /* no rotation: `normal' position */
- #define ROT_LEFT 1 /* 1/4 turn counterclockwise */
- #define ROT_DOWN 2 /* 1/2 turn, i.e., upside-down */
- #define ROT_RIGHT 3 /* 3/4 turn ccw, or 1/4 turn cw */
-
- struct font {
- int f_flags; /* see below */
- struct fontops *f_ops; /* operations */
- /*
- * f_details is provided for font reading subroutines.
- * It is intended to be cast to a pointer to a structure
- * that is allocated by those routines, and used to keep
- * track of whatever information those routines need to
- * determine glyph boxes and (if asked for) rasters.
- */
- char *f_details; /* type dependent stuff */
- /*
- * f_path is the full pathname to the font file, filled in
- * by GetFont and GetRasterlessFont. Note that since we
- * hold on to the path until the font is freed, it should be
- * possible to cache glyph accesses on memory-poor machines.
- */
- char *f_path; /* font file pathname */
- /*
- * f_dvimag and f_dvidsz are the magnification and design size
- * values from the DVI file. f_font and f_scaled correspond to
- * TeX's idea of the proper name for the font (e.g., `cmr10',
- * `cmbx10 scaled 1440'). (Note that f_scaled is just the
- * ratio of f_dvimag and f_dvidsz; you could save a bit of memory
- * by eliminating it and altering the routine Font_TeXName()).
- * f_checksum should be set by the font reading routines to
- * the font checksum. If the value is nonzero, it will be
- * compared to the checksum in the DVI file.
- */
- i32 f_dvimag; /* magnification from DVI file */
- i32 f_dvidsz; /* design size from DVI file */
- char *f_font; /* TeX's name for the font */
- int f_scaled; /* the ratio of dvimag to dvidsz, x1000 */
- i32 f_checksum; /* font checksum, or 0 */
- #ifdef notyet /* THESE NEED MORE THOUGHT */
- i32 f_hppp; /* horizontal pixels per point */
- i32 f_vppp; /* vertical pixels per point */
- #endif
- /*
- * f_lowch and f_highch bound the region in which f_gly
- * indicies are valid. Specificially, f_gly[i] may be
- * read or written if and only if i is in the half-open
- * interval [f_lowch..f_highch). f_gly is an array of
- * pointers to glyph structures. The structures themselves
- * are not allocated until requested.
- *
- * f_glybase is the actual return from malloc(), since it
- * is theoretically possible for f_gly-f_lowch to become
- * NULL.
- */
- int f_lowch; /* first character */
- int f_highch; /* last character, plus 1 */
- struct glyph **f_gly; /* glyphs */
- struct glyph **f_glybase;
- };
-
- /*
- * Font flags.
- */
- #define FF_RASTERS 0x0001 /* font has rasters */
- #define FF_USR0 0x0100 /* reserved to user code */
- #define FF_USR1 0x0200 /* reserved to user code */
- #define FF_USR2 0x0400 /* reserved to user code */
- #define FF_USR3 0x0800 /* reserved to user code */
-
- /*
- * Operations on fonts.
- *
- * The `fo_dpitomag' field is used as a multiplier for a desired
- * resolution in dots per inch. The result of the multiplication
- * is converted to a font name by multipying by 1000.0 and rounding.
- * The idea is that PXL files will have a multiplier of 5.0, and
- * others will have a multiplier of 1.0. This suffices for the
- * present, at any rate; in the future, this field may be replaced
- * with something more general.
- *
- * N.B.: more operations may be added as they are discovered to be
- * useful.
- */
- struct fontops {
- char *fo_name; /* name, e.g., "gf" */
- double fo_dpitomag; /* multiplier */
- int (*fo_read)(); /* open and read the font itself */
- int (*fo_getgly)(); /* obtain specified glyphs (range) */
- #ifdef notdef
- int (*fo_freegly)(); /* release specified glyphs */
- #endif
- int (*fo_rasterise)(); /* rasterise specified glyphs */
- int (*fo_freefont)(); /* discard font (free details) */
- struct fontops *fo_next; /* purely for font.c */
- };
-
- /*
- * Return a pointer to the glyph information for character `c' in
- * font `f'.
- */
- #define GLYPH(f, c) \
- ((c) < (f)->f_lowch || (c) >= (f)->f_highch ? (struct glyph *) 0 : \
- ((f)->f_gly[c] ? (f)->f_gly[c] : GetGlyph(f, c)))
-
- /*
- * True iff glyph `g' is valid. Useful for checking return values
- * from GLYPH().
- */
- #define GVALID(g) ((g) && ((g)->g_flags & GF_VALID))
-
- /*
- * True iff glyph g has a raster.
- */
- #define HASRASTER(g) ((g)->g_height || (g)->g_width)
-
- /*
- * Return a pointer to the raster information for glyph `g' in font
- * `f' at rotation `r'.
- */
- #define RASTER(g, f, r) ((g)->g_rotation == (r) && (g)->g_raster ? \
- (g)->g_raster : GetRaster(g, f, r))
-
- /*
- * Function types.
- */
- struct font *GetFont(), *GetRasterlessFont();
- struct glyph *GetGlyph();
- char *GetRaster();
- void FreeFont();
- void FreeGlyph();
- void FreeRaster();
- char *Font_TeXName();
- double DMagFactor(); /* from magfactor.c */
-
- /*
- * Normally from stdio.h
- */
- #ifndef NULL
- #define NULL 0
- #endif
-
- /*
- * The following environment variable overrides the default font
- * configuration file. That default is used when fontinit() is not
- * called, or is passed a null pointer.
- */
- #define CONFENV "TEXFONTDESC"
-